package com.sky.chapter3.cas;

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author : wushikai
 * <p>
 * date : 2022-07-05
 * CAS是JDK提供的非阻塞原子性操作，它通过硬件保证了比较-更新的原子性。
 * 它是非阻塞的且自身原子性，也就是说这玩意效率更高且通过硬件保证，说明这玩意更可靠。
 *
 * CAS是一条CPU的原子指令（cmpxchg指令），不会造成所谓的数据不一致问题，
 * Unsafe提供的CAS方法（如compareAndSwapXXX）底层实现即为CPU指令cmpxchg。
 * 执行cmpxchg指令的时候，会判断当前系统是否为多核系统，如果是就给总线加锁，
 * 只有一个线程会对总线加锁成功，加锁成功之后会执行cas操作，也就是说CAS的原子性实际上是CPU实现的，
 * 其实在这一点上还是有排他锁的，只是比起用synchronized， 这里的排他时间要短的多， 所以在多线程情况下性能会比较好
 */
public class CasDemo2 {

    public static void main(String[] args)  {
        AtomicInteger atomicInteger = new AtomicInteger(5);

        System.out.println(atomicInteger.compareAndSet(5, 2020) + "\t" + atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5, 1024) + "\t" + atomicInteger.get());
    }
}


